package com.guojian.common.listener.shiro;

import java.lang.reflect.Method;

import org.apache.shiro.event.support.DefaultEventBus;
import org.apache.shiro.event.support.SingleArgumentMethodEventListener;

import com.guojian.common.listener.UserRegisterEvent;
import com.guojian.common.listener.UserRegisterListener;

/**
 * 
 * shiro_事件总线的测试,将事件发布与订阅的机制进行轻量级封装,
 * 
 * @SingleArgumentMethodEventListener 监听器的一种变体,可以将对象中所有的方法包装成监听器
 * @AnnotationEventListenerResolver ==> List<EventListener> getEventListeners(final Object instance)
 * 1.将某个类对象中所有标注 @Subscribe 的方法封装成一个监听器,
 * 2.这个监听器监听的事件就是第一个参数
 * 3.DefaultEventBus后,就不用为每个监听创建一个类,可以实现一个类有多个监听器,最后采用反射调用监听的对象
 * 
 * @author GuoJian
 *
 */
public class ShiroEventBusTest {

	public static void main(String[] args) {

		DefaultEventBus eventBus = new DefaultEventBus();

		eventBus.register(new UserLoginListener());//注册监听

		UserLoginEvent event = new UserLoginEvent("UserLoginEvent");

		eventBus.publish(event);//发布事件,监听器会自动触发,springboot.run()中大量使用 

		testEventBus();

	}

	@SuppressWarnings("unchecked")
	public static void testEventBus() {
		UserRegisterListener registerListener = new UserRegisterListener();

		Method method = UserRegisterListener.class.getDeclaredMethods()[0];

		SingleArgumentMethodEventListener singleListener = new SingleArgumentMethodEventListener(registerListener, method);

		System.out.println(singleListener.getEventType().isAssignableFrom(UserRegisterEvent.class));
	}

}
